package com.c2b.algorithm.leetcode.base;

/**
 * 合并两个有序数组
 * <p>给你两个按 非递减顺序 排列的整数数组nums1 和 nums2，另有两个整数 m 和 n ，分别表示 nums1和 nums2中的元素数目。<br>
 * <p>
 * 请你合并 nums2 到 nums1 中，使合并后的数组同样按 非递减顺序 排列。<br>
 * <p>
 * 注意：最终，合并后数组不应由函数返回，而是存储在数组 nums1 中。<br>
 * 为了应对这种情况，nums1 的初始长度为 m + n，其中前 m 个元素表示应合并的元素，后 n 个元素为 0 ，应忽略。nums2 的长度为 n 。</p>
 *
 * @author c2b
 * @since 2022/5/25 16:01
 */
public class LC0088merge {

    /**
     * 合并两个有序数组--双指针
     * <p>注意：m,n在[0,200]之间
     *
     * @param nums1 数组1
     * @param m     数组1中元素的个数
     * @param nums2 数组2
     * @param n     数组2中元素的个数
     * @author c2b
     * @since 2022/5/25 16:03
     */
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int numS1Index = m - 1;
        int numS2Index = n - 1;
        int index = m + n - 1;
        // 数组1 和 数组2 从 0 下标开始遍历，直到其中一个遍历完
        while (numS1Index >= 0 && numS2Index >= 0) {
            nums1[index--] = nums1[numS1Index] > nums2[numS2Index] ? nums1[numS1Index--] : nums2[numS2Index--];
        }
        // 如果数组1 遍历完了
        while (numS2Index >= 0) {
            nums1[index--] = nums2[numS2Index--];
        }
    }
}
